今天的學習是 Scope & Closure CH.3 的內容,主要針對 function declaration 及 functional expression 的 scope 做研究。
先複習一下 function declaration 和 function expression 的差別:
// function declaration
function booking(){
...
};
// named function expression
var booking = function flight() {
...
};
// anonymous function expression
var booking = function() {
...
};
今天的學習內容是 function name 的 scope,我們一個個拆解
function declaration
function booking(){
...
}
console.log(booking);
// function booking()...
上面的 function declaration 會在 outer/enclosing scope 創建一個 booking 的 identifier,在相同的 scope 可以調用 booking
anonymous function expression
var booking = function() {
...
}
在上面的例子,booking 一樣會被建立,因為函式表達式的 function definition 不會 hoist,所以 booking 與 function definition 要等到執行 assignment 的時候才會有連結,那麼 function expression scope 呢 ... ?
我們已經知道 function declaration scope 會在 outer/enclosing scope 建立 identifier
那麼 function expression scope 呢?
var booking = function flight() {
console.log(flight);
};
booking();
// function flight()...
console.log(flight);
// ReferenceError: flight is not defined
**可以看出 named function expression 的作用域是在 function definition 裡面,這就是為什麼 console.log(flight)
會是 ReferenceError
的原因,因為在 scope 裡找不到 flight
;
因為 function expression 的作用域在 function definition 裡面,所以 booking()
log 出來 function flight()...
;
至於 anonymous function expression 因為沒有 identifier 的關係,所以沒有 scope 的問題。
今天份的學習到這邊